package me.yushuai.wukong.base.service;

import me.yushuai.wukong.base.api.dto.CartonDTO;
import me.yushuai.wukong.base.api.dto.CreateCartonDTO;
import me.yushuai.wukong.base.api.dto.PagingSearchCarton;
import me.yushuai.wukong.base.api.dto.UpdateCartonDTO;
import me.yushuai.wukong.common.dto.PageDTO;
import me.yushuai.wukong.common.error.WuKongException;
import me.yushuai.wukong.common.exceptin.DuplicateBizIdException;
import me.yushuai.wukong.common.exceptin.NotExistException;

/**
 * 包箱业务接口
 *
 * @author zhoushuai@189.cn
 * @date 2022-09-09
 */
public interface CartonService {

    /**
     * 新建一条库位信息
     *
     * @param createCartonDTO 库位信息
     * @return 返回库位信息编号
     * @throws DuplicateBizIdException 当库位已存在时抛出异常
     */
    Long createCarton(CreateCartonDTO createCartonDTO) throws DuplicateBizIdException;

    /**
     * 修改库位信息
     *
     * @param updateCartonDTO 库位信息
     * @return 返回修改后的库位编号
     * @throws NotExistException 当库位不存在时抛出异常
     */
    Long updateCarton(UpdateCartonDTO updateCartonDTO) throws NotExistException;

    /**
     * 删除一条库位信息
     *
     * @param cartonId 库位编号
     * @throws NotExistException 当库位编码不存在时抛出异常
     */
    void deleteCarton(Long cartonId) throws NotExistException;

    /**
     * 通过ID查询库位的详细信息
     *
     * @param cartonId 库位编号
     * @return 返回库位的详细信息
     * @throws NotExistException 当库位不存在时抛出异常
     */
    CartonDTO findById(Long cartonId) throws NotExistException;

    /**
     * 分页条件检索库位信息
     *
     * @param pagingSearchCarton 分页检索条件
     * @return 分页返回查询结果
     */
    PageDTO<CartonDTO> pagingSearchCarton(PagingSearchCarton pagingSearchCarton);

    /**
     * 断言库位编号检查存在
     *
     * @param cartonId 库位编号
     * @throws WuKongException 当库位编号不存在时抛出异常
     */
    void assertCartonIdHasExist(Long cartonId) throws WuKongException;

    /**
     * 断言库位编号与库位编码匹配
     *
     * @param cartonId   库位编号
     * @param cartonCode 库位编码
     * @throws WuKongException 当库位编号与库位编码不匹配时抛出异常
     */
    void assertCartonIdAndCartonCodeMatch(Long cartonId, String cartonCode) throws WuKongException;

    /**
     * 断言库位编码不存在
     *
     * @param cartonCode 库位编码
     * @throws WuKongException 当库位编码存在时抛出异常
     */
    void assertCartonCodeNotExist(String cartonCode) throws WuKongException;


    /**
     * 检查装箱编号是否存在
     *
     * @param cartonId 装箱编号
     * @return 装箱编号存在时返回true否则返回false
     */
    boolean checkCartonIdExist(Long cartonId);

    /**
     * 检查装箱编码是否存在
     *
     * @param cartonCode 装箱编码
     * @return 装箱编码存在时返回true否则返回false
     */
    boolean existByBizId(String cartonCode);
}
